<?php
class Test{
	public function __construct(){
		foreach (get_class_methods(__CLASS__) as $item) {
			if($item=='__construct')continue;
			if(strpos(strtolower($item),'test'))$this->run($item);
		}
	}
	public function run($name){
		if(isset($GLOBALS['errors']))unset($GLOBALS['errors']);
		echo('<fieldset>');
		$t=microtime(true);
		$this->$name();
		echo '<div>'.number_format(microtime(true)-$t,4).'c</div>';
		echo CoreExeption::showErrorLog();
		if(isset($GLOBALS['errors']))unset($GLOBALS['errors']);
		echo('</fieldset>');
	}
	private function header($title){
		echo '<legend>'.$title.'</legend>';
	}
	public static function element($element_name,$result){
		echo '<div>'.($result?'OK':'<b>FAIL</b>').' - '.$element_name.'</div>';
	}
/////////////////////////////////////

//тестируем файл конфигурации
	private function configTest(){
		$this->header('Файл конфигураций');
		import('core.config');
		$this->element('Существование переменной db_type', 				Config::_('db_type'));
	}
//тестируем переменные
	private function varTest(){
		$this->header('Глобальные переменные');
		import('core.vars',true);
		$this->element('Записываем переменную var', 					Vars::_('var',5)==5);
		$this->element('Читаем переменную var', 						Vars::_('var')==5);
		$this->element('Инкрементируем переменную var', 				Vars::i('var')==6);
		$this->element('Декрементируем переменную var', 				Vars::d('var')==5);
		$this->element('Удаляем переменную var',						Vars::delete('var'));
		$this->element('Читаем не существующую переменную var', 		!Vars::_('var'));
		$this->element('Инкрементируем не существующую переменную var', !Vars::i('var'));
		$this->element('Декрементируем не существующую переменную var', !Vars::d('var'));
		$this->element('Удаляем не существующую переменную var',		!Vars::delete('var'));
	}
//тестируем события
	private function eventTest(){
		$this->header('События');
		import('core.event',true);
		$this->element('Вешаем одноразовый обработчик eventHandler на событие testEvent', 			Event::add('testEvent','Test','eventHandler',true)!==false);
		$this->element('Проверяем существование события testEvent',						 			Event::is_event('testEvent'));
		$this->element('Отрабатываем событие testEvent (должен отработать 1 елемент)',				Event::_('testEvent',10));
		$this->element('Вешаем ещё один одноразовый обработчик eventHandler2 на событие testEvent', Event::add('testEvent','Test','eventHandler2',true)!==false);
		$this->element('Отрабатываем событие testEvent (должен отработать 1 елемент)', 				Event::_('testEvent',10));
		$this->element('Отрабатываем событие testEvent (элементы не должны отработать)',			Event::_('testEvent',10));
		$this->element('Вешаем обработчик eventHandler на событие testEvent', 						Event::add('testEvent','Test','eventHandler')!==false);
		$this->element('Вешаем обработчик eventHandler2 на событие testEvent', 						Event::add('testEvent','Test','eventHandler2')!==false);
		$this->element('Отрабатываем событие testEvent (должно отработать 2 елемента)',				Event::_('testEvent',10));
		//Event::info('testEvent');
		$this->element('Удаляем обработчик eventHandler2 из события testEvent по номеру 3',			Event::delete('testEvent',3));
		$this->element('Отрабатываем событие testEvent (должен отработать 1 елемент)',				Event::_('testEvent',10));
		$this->element('Удаляем обработчик eventHandler из события testEvent по ссылке',			Event::delete('testEvent','Test::eventHandler'));
		//Event::info('testEvent');
		$this->element('Удаляем несуществующий обработчик из события testEvent по номеру 1',		!Event::delete('testEvent',1));
		$this->element('Удаляем несуществующий обработчик из события testEvent по ссылке',			!Event::delete('testEvent','Test::eventHandler'));
		$this->element('Отрабатываем событие testEvent (элементы не должны отработать)', 			Event::_('testEvent',10));		
		$this->element('Удаляем событие testEvent',													Event::delete('testEvent'));
		$this->element('Отрабатываем несуществующее событие testEvent', 								Event::_('testEvent',10)===null);	
		$this->element('Проверяем существование несуществующего события testEvent',					!Event::is_event('testEvent'));
		$this->element('Удаляем несуществующее событие testEvent',									!Event::delete('testEvent'));	
		$this->element('Инфо о несуществующем событии testEvent',									!Event::info('testEvent'));	

	}
	public static function eventHandler($params){
		echo '--><br>';
		Test::element('Срабатывание функции eventHandler повешенной на евент testEvent',true);
		Test::element('Передача переменных для eventHandler',$params==10);
		echo '<--<br>';
		return true;
	}
	public static function eventHandler2($params){
		echo '--><br>';
		Test::element('Срабатывание функции eventHandler2 повешенной на евент testEvent',true);
		Test::element('Передача переменных для eventHandler2',$params==10);
		echo '<--<br>';
		return true;
	}
//тестируем управление файлами
	private function fileTest(){
		$this->header('Управление файлами');
		import('core.file');
		$this->element('Создаём файл core/text.txt', 										File::create('core/text.txt'));
		$this->element('Записываем данные в файл core/text.txt', 							File::_('core/text.txt','test'));
		$this->element('Проверяем данные в файле core/text.txt', 							File::_('core/text.txt')=='test');
		$this->element('Дописываем в начало файла core/text.txt', 							File::_('core/text.txt','1',array('mode'=>File::PREPEND)));
		$this->element('Проверяем данные в файле core/text.txt', 							File::_('core/text.txt')=='1test');
		$this->element('Дописываем в конец файла core/text.txt', 							File::_('core/text.txt','2',array('mode'=>File::APPEND)));
		$this->element('Проверяем данные в файле core/text.txt', 							File::_('core/text.txt')=='1test2');
		$this->element('Изменяем данные при помощи fileCalback в файле core/text.txt', 		File::_('core/text.txt',null,array('mode'=>File::CALLBACK,'callback'=>array('Test','fileCalback'))));
		$this->element('Проверяем данные в файле core/text.txt', 							File::_('core/text.txt')=='132');
		$this->element('Изменяем данные при помощи fileCalback2 в файле core/text.txt', 	File::_('core/text.txt',null,array('mode'=>File::CALLBACK,'callback'=>'fileCalback2')));
		$this->element('Проверяем данные в файле core/text.txt', 							File::_('core/text.txt')=='123');
		$this->element('Проверяем существование файла core/text.txt', 						File::exists('core/text.txt'));
		$this->element('Проверяем записываемаость файла core/text.txt', 					File::writable('core/text.txt'));
		$this->element('Удаляем файл core/text.txt', 										File::delete('core/text.txt'));
		$this->element('Проверяем существование несуществующего файла core/text.txt', 		!File::exists('core/text.txt'));
		$this->element('Читаем несуществующий файл core/text.txt',							!File::_('core/text.txt'));
		$this->element('Записываем данные в несуществующий файл core/text.txt', 			!File::_('core/text.txt','test'));
		$this->element('Проверяем записываемаость несуществующего файла core/text.txt', 	File::writable('core/text.txt')===null);
		$this->element('Удаляем несуществующий файл core/text.txt', 						!File::delete('core/text.txt'));
	}
	public static function fileCalback($text){
		Test::element('Передача текста в функцию обработки fileCalback',$text=='1test2');
		return str_replace('test',3,$text);
	}
//тестируем переводы
	private function langTest(){
		$this->header('Переводы');
		import('core.t');
		T::$debug_mode=T::LOG_DEBUG;
		$this->element('Загружаем переводы дефоултной локали для test', 					T::load('test'));
		$this->element('Переводим простую строку hello', 									T::_('hello')=='привет');
		$this->element('Переводим сложную cтроку other', 									T::_('other',array(20))=='need 20 money');
		$this->element('Переводим несуществующую строку man', 								T::_('man')=='MAN');
		$this->element('Переводим несуществующую строку weman', 							T::_('weman')=='WEMAN');
		$this->element('Загружаем переводы дефоултной локали для test2', 					T::load('test2'));
		$this->element('Переводим простую строку hello', 									T::_('hello')=='куку');
		$this->element('Проверяем логирование дубликатов',	 								isset(T::$double['test2']) && count(T::$double['test2'])==1);
		$this->element('Проверяем логирование пропущенных слов',							count(T::$lost)==2);
	}
//тестируем mysql
	private function mysqlTest(){
		$this->header('Mysql');
		import('core.db.mysql');
		$db=Core::getDB();
		$this->element('Connect', 										$db->connect());
		$this->element('Get Array по строке', 							$db->getArray('show tables'));
		$this->element('Get Array по ресурсу', 							$db->getArray($db->query('show tables')));
	}
//тестируем модель
	private function modelTest(){
		$this->header('Mysql');
		import('core.model');
		$tag=import('model.tag',true);
		$this->element('Выбираем тайтл всех тегов с user_id=37',				$tag->loadOne(false,ModelTag::F_TITLE,array('where'=>ModelTag::F_USER_ID."=37"))=='all');
		$this->element('Добавляем новые элемент с user_id=10',					$last=$tag->save(array(	ModelTag::F_TITLE=>'test',	ModelTag::F_USER_ID =>10)));
		$this->element('Выбираем новые элемент с user_id=10',					$tag->loadOne(false,ModelTag::F_TITLE,array('where'=>ModelTag::F_USER_ID."=10"))=='test');
		$this->element('Изменяем элемент по id='.$last,							$tag->save(array(ModelTag::F_TITLE=>'test2'),$last));
		$this->element('Выбираем новые элемент по id='.$last,					$tag->loadOne($last,ModelTag::F_TITLE)=='test2');
		$this->element('Удаляем елемент по id='.$last,							$tag->delete($last));
		$this->element('Выбираем кастомное поле тега с id=4',					$tag->loadOne(4,ModelTag::F_PERCENT_COUNT_ELEMENTS)==75);
		$this->element('Выбираем имя пользователя создавшего тег с id=4',		$tag->loadOne(4,ModelUser::TABLE.DOT.ModelUser::F_NAME)=='ad');
		$modeltag_to_shop=import('model.tag_to_shop',true);
		$result=$modeltag_to_shop->allTagForShop(8);
		$this->element('Выбираем теги для магазина с id=8',						$result[0]['tag_id']==4);
		
	}
}
function fileCalback2($text){
	Test::element('Передача текста в функцию обработки fileCalback2',$text=='132');
	return str_replace('32',23,$text);
}